package shg.book.control
{
	import com.hurlant.crypto.Crypto;
	import com.hurlant.crypto.prng.Random;
	import com.hurlant.crypto.symmetric.ICipher;
	
	import flash.events.Event;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.net.FileFilter;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextLineMetrics;
	import flash.utils.ByteArray;
	
	import mx.utils.UIDUtil;
	
	import shg.book.size.BookData;
	import shg.book.view.AuthorEdit;

	/**
	 * 该类制作一个纯文本的书籍类
	 * */
	public class MakeTextBook
	{
		//文件选择过滤
		private var fileFileter:FileFilter;
		private var authorEdit:AuthorEdit;
		//选择文件的名称
		private var fileName:String;
		//此文件里面读取到的内容
		private var contentText:String;
		//当前这一页的文本总高度
		private var pageHeigth:uint=0;
		//当前页的暂存字符串
		private var currentPage:String="";
		//保存所有页面的字符
		private var pages:ByteArray;
		//表示版权和版本号
		private var copyRight:String;
		//原来存储最后的数据
		private var dataToStore:ByteArray;
		//数据的所有内容
		private var contentByte:ByteArray;
		//当前这一页的开始位置
		private var posiction:Number=0;
		
		public function MakeTextBook()
		{
		}
		/**
		 *  类的起始函数
		 * */
		public function initApp(edit:AuthorEdit):void{
			authorEdit=edit;
			fileFileter=new FileFilter("选择文件*.txt *.xml","*.txt;*.xml");
			var file:File=File.documentsDirectory;
			file.browseForOpen("打开文件",[fileFileter]);//默认为用户文档路径
			file.addEventListener(Event.SELECT,selectFile);
		}
		/**
		 * 加载所选择的文件
		 * */
		private function selectFile(event:Event):void{
			fileName=event.currentTarget.name;
			var request:URLRequest = new URLRequest(event.currentTarget.nativePath.toString());
			var loader:URLStream = new URLStream();
			loader.addEventListener(Event.COMPLETE, loaderFile);
			loader.load(request);
		}
		/**
		 * 加载本地文件
		 * */
		private function loaderFile(event:Event):void{
			var fileStream:URLStream=event.currentTarget as URLStream;
			//文本内容
			contentText=fileStream.readMultiByte(fileStream.bytesAvailable,"GB2312");
			var textField:TextField=new TextField();
			textField.wordWrap=true;						//允许自动换行
			textField.width=BookData.getContentWidth();	//每行文本的显示宽度
			//给文本添加样式
			var format:TextFormat = new TextFormat();
			format.font = authorEdit.simple_Family;
			format.color = authorEdit.simple_Color.toString();
			format.size = authorEdit.simple_FontSize.toString();
			format.bold=authorEdit.simple_Weight;
			//设置文本样式
			textField.defaultTextFormat=format;
			//把文件里面的数据读入textField类里面
			textField.text=contentText;
			var pageSize:String="";
			//分页处理
			var oldSize:int=0;
			for(var i:Number=0;i<textField.numLines;i++){
				var lineMetrics:TextLineMetrics=textField.getLineMetrics(i);
				//计算当前这一页的总高度，如果总高度大于每一页的显示高度就立即分页
				pageHeigth+=lineMetrics.height;
				if(pageHeigth>=BookData.getContentHeigth()){
					if(pages==null)
						pages=new ByteArray();
					posiction=pages.position;//当前也的起始位置
					pages.writeUTFBytes(currentPage);
					//记住这里需要清空当前页的信息
					currentPage="";
					pageHeigth=lineMetrics.height;
					pageSize+=posiction.toString()+":"+(pages.length-oldSize).toString()+"&"
					oldSize=pages.length;
				} 
				//如果另起新的一行就需要把前面一行保存下来，注意这个位置不能乱换，只能在这里
				currentPage+=textField.getLineText(i);
				//如果已经是最后一个字符了就需要最后一行也添加进数组里面
				if((i+1)==textField.numLines){
					posiction=pages.position;//当前也的起始位置
					pages.writeUTFBytes(currentPage);
					pageSize+=posiction.toString()+":"+(pages.length-oldSize).toString();
				}
			}
			if(authorEdit.create_password.length>0 && authorEdit.charge_book.selected){
				changeBook(contentText);
			}else{
				freeBook(contentText,pageSize);
			}
		}
		/**
		 * 收费的时间
		 * */
		private function changeBook(contentText:String):void{
		
		}
		/**
		 *0000000000			有无版权
		 *0000000000			密钥
		 *0000000000			加密字符串长度
		 *0000000000			书籍ID号
		 *0000000000			书籍宽度和高度数组长度
		 *0000000000			书籍高度和宽度数组
		 *0000000000			图片数组长度
		 *275688&142007&183591&162566	图片数组
		 *0000000000			字体样式长度
		 *Verdana&normal&16&0		字体样式
		 *0000000000			分页长度
		 *565&877&565&877&565&877&565	分页数组
		 * */
		private function freeBook(contentText:String,pageSize:String):void{
			//版权和版本号、这表示免费纯文本
			copyRight="0000000000";
			//构造一个UUID来表示数据ID唯一ID号,长度为规定的32位
			var bookId:String="";
			for(var i:int=0;i<UIDUtil.createUID().split("-").length;i++){
				bookId+=UIDUtil.createUID().split("-")[i];
			}
			//书籍的宽度和高度数组
			var bookSize:String=BookData.BOOK_WIDTH.toString()+"&"+BookData.BOOK_HEIGTH.toString();
			//数据大小字符串长度
			var bookSizeLength:String=setLength(bookSize.length);
			//图片数组的长度和图片数组
		   var conver:String=setLength(authorEdit.conver_size.length)+authorEdit.conver_size;	
		   //下面是字体样式的长度和字体样式
		   var style:String=setLength((authorEdit.simple_Family+"&"+authorEdit.simple_Color.toString()+"&"
			   +authorEdit.simple_FontSize.toString()+"&"+authorEdit.simple_Weight).length)
			   +authorEdit.simple_Family+"&"+authorEdit.simple_Color.toString()+"&"
			   +authorEdit.simple_FontSize.toString()+"&"+authorEdit.simple_Weight;
		   //下面是分页数组的长度和分页数组
		   var page:String=setLength(pageSize.length)+pageSize;
		   //将我们需要加密的数据保存到byteArray数组里面
		   var adversitAes:ByteArray = new ByteArray();
		   adversitAes.writeUTFBytes(bookId+bookSizeLength+bookSize+conver+style+page);
		   //加密数据并返回
		   dataToStore=aes(copyRight,adversitAes);
		   
		   //将所有的数据整理好然后写入文件
		   contentByte=new ByteArray();
		   //加密数据，版权信息和公有密钥
		   dataToStore.position=0;
		   contentByte.writeBytes(dataToStore);
		   //封面图片
		   authorEdit.fourCoverPage.position=0;
		   contentByte.writeBytes(authorEdit.fourCoverPage);
		   //文本内容
		   contentByte.writeUTFBytes(contentText);
		   //输出文件
		   writeFile(contentByte);
		}
		/**
		 * 传进来一个整数返回一个有0组成的字符串
		 * */
		private function setLength(_str:Number):String{
			var str_length:String=String(_str);
			var str:String="";
			if(str_length!=null){
				for(var r:int=0;r<10-String(_str).length;r++){
					str+="0";
				}
			}else{
				return "0000000000";
			}
			str_length=str+str_length;
			return str_length;
		}
		/**
		 * 对文件内容进行加密，返回加密得到的字节数组
		 * */
		private function aes(copyRight:String,adversitAes:ByteArray):ByteArray{
			//生成一个随机密钥
			var key:ByteArray = new ByteArray(); 
			var random:Random=new Random();
			random.nextBytes(key,16);
			//使用128位AES算法加密
			var aes:ICipher = Crypto.getCipher("aes-ecb", key, Crypto.getPad("pkcs5"));
			aes.encrypt(adversitAes); 
			//将数据和KEY一起保存 
			var store:ByteArray = new ByteArray();
			store.writeUTFBytes(copyRight)						//版权
			store.writeBytes(key);								//密钥
			store.writeUTFBytes(setLength(adversitAes.length));//加密字符串长度
			store.writeBytes(adversitAes);						//加密的字符串
			return store;
		}
		/**
		 * 写出数据
		 * */
		private function writeFile(byte:ByteArray):void{
			byte.position=0;
			var file:File=null;
			var index:String="";
			var i:int=0;
			do{
				file=File.desktopDirectory.resolvePath(authorEdit.bookName.text+index+BookData.EXTENSION);
				trace(file.nativePath);
				i++;
				index="["+i+"]";
			}while(file.exists)
			var fileStream:FileStream=new FileStream();
			fileStream.open(file,FileMode.WRITE);
			fileStream.writeBytes(byte);
			fileStream.close();
		}
	}
}